]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
Store CSS classes and pseudo-classes pre-split in the StThemeNode
authorSimon McVittie <simon.mcvittie@collabora.co.uk>
Wed, 7 Nov 2012 18:44:33 +0000 (18:44 +0000)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Wed, 14 Nov 2012 19:23:40 +0000 (19:23 +0000)
Tokenizing every time we want to evaluate CSS seems a poor plan.

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
src/st/st-theme-node-private.h
src/st/st-theme-node.c
src/st/st-theme-node.h

index 9ceee1cc1e1ddf8fb2c2ff70552682e1cf6cc786..5958441f9f942fc22ddedc23d8adaad6a0a993db 100644 (file)
@@ -78,7 +78,9 @@ struct _StThemeNode {
   GType element_type;
   char *element_id;
   char *element_class;
+  GStrv element_classes;
   char *pseudo_class;
+  GStrv pseudo_classes;
   char *inline_style;
 
   CRDeclaration **properties;
index 7e966e8af6cd48ac3d723d5101fec48ee03c9978..31bcf8aa5be1839635e8fd7f7bdad3ecf715684d 100644 (file)
@@ -97,7 +97,9 @@ st_theme_node_finalize (GObject *object)
 
   g_free (node->element_id);
   g_free (node->element_class);
+  g_strfreev (node->element_classes);
   g_free (node->pseudo_class);
+  g_strfreev (node->pseudo_classes);
   g_free (node->inline_style);
 
   if (node->properties)
@@ -145,6 +147,33 @@ st_theme_node_finalize (GObject *object)
   G_OBJECT_CLASS (st_theme_node_parent_class)->finalize (object);
 }
 
+static GStrv
+split_on_whitespace (const gchar *s)
+{
+  gchar *cur;
+  gchar *l;
+  gchar *temp;
+  GPtrArray *arr;
+
+  if (s == NULL)
+    return NULL;
+
+  arr = g_ptr_array_new ();
+  l = g_strdup (s);
+
+  cur = strtok_r (l, " \t\f\r\n", &temp);
+
+  while (cur != NULL)
+    {
+      g_ptr_array_add (arr, g_strdup (cur));
+      cur = strtok_r (NULL, " \t\f\r\n", &temp);
+    }
+
+  g_free (l);
+  g_ptr_array_add (arr, NULL);
+  return (GStrv) g_ptr_array_free (arr, FALSE);
+}
+
 /**
  * st_theme_node_new:
  * @context: the context representing global state for this themed tree
@@ -202,7 +231,9 @@ st_theme_node_new (StThemeContext    *context,
   node->element_type = element_type;
   node->element_id = g_strdup (element_id);
   node->element_class = g_strdup (element_class);
+  node->element_classes = split_on_whitespace (element_class);
   node->pseudo_class = g_strdup (pseudo_class);
+  node->pseudo_classes = split_on_whitespace (pseudo_class);
   node->inline_style = g_strdup (inline_style);
 
   return node;
@@ -265,6 +296,19 @@ st_theme_node_get_element_class (StThemeNode *node)
   return node->element_class;
 }
 
+/**
+ * st_theme_node_get_element_classes:
+ *
+ * Returns: (transfer none): the element's classes
+ */
+GStrv
+st_theme_node_get_element_classes (StThemeNode *node)
+{
+  g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL);
+
+  return node->element_classes;
+}
+
 const char *
 st_theme_node_get_pseudo_class (StThemeNode *node)
 {
@@ -273,6 +317,19 @@ st_theme_node_get_pseudo_class (StThemeNode *node)
   return node->pseudo_class;
 }
 
+/**
+ * st_theme_node_get_pseudo_classes:
+ *
+ * Returns: (transfer none): the element's pseudo-classes
+ */
+GStrv
+st_theme_node_get_pseudo_classes (StThemeNode *node)
+{
+  g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL);
+
+  return node->pseudo_classes;
+}
+
 /**
  * st_theme_node_equal:
  * @node_a: first #StThemeNode
index 2c672ebcfb2fd02477dea0169413991d4a80fdbd..31b200d7f74f2c3bdf16d20546708fe06cf44b73 100644 (file)
@@ -114,7 +114,9 @@ gboolean    st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b);
 GType       st_theme_node_get_element_type  (StThemeNode *node);
 const char *st_theme_node_get_element_id    (StThemeNode *node);
 const char *st_theme_node_get_element_class (StThemeNode *node);
+GStrv       st_theme_node_get_element_classes (StThemeNode *node);
 const char *st_theme_node_get_pseudo_class  (StThemeNode *node);
+GStrv       st_theme_node_get_pseudo_classes (StThemeNode *node);
 
 /* Generic getters ... these are not cached so are less efficient. The other
  * reason for adding the more specific version is that we can handle the